#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行，
# 第2行注释表示.py文件本身使用标准UTF-8编码：
print("#############序列化#############")
import pickle

# dict{'name':'Bob', 'age':20, 'score':88}
# dict(name='Bob', age=20, score=88)
d = dict(name='Bob', age=20, score=88)
print(d)
print(pickle.dumps(d))
# pickle.dumps()方法把任意对象序列化成一个bytes，然后，就可以把这个bytes写入文件
# 或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object：
d.__setitem__('sex', '男')  # 增加一个键值对
with open('dump.txt', 'wb') as file:
    pickle.dump(d, file)
# 可以先把内容读到一个bytes，然后用pickle.loads()方法反序列化出对象，
# 也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象
with open('dump.txt', 'rb') as file2:
    d2 = pickle.load(file2)
print('d2', d2)
print("#############在不同的编程语言之间，使用json和xml的方式#############")
import json

json_str = json.dumps(d)
print('json_str:', json_str)
d = json.loads(json_str)
d2 = json.loads("{\"name\": \"Bob\", \"age\": 20, \"score\": 88, \"sex\": \"男\"}")
print('d:', d)
print('d2:', d2)
print("#############将对象转化为json字符串#############")


class Student(object):
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

    def __str__(self):
        return 'name' + self.name + 'age' + str(self.age) + 'sex' + self.sex


def student2dict(stu):
    return {"name": stu.name, 'age': stu.age, 'sex': stu.sex}


stu = Student('王永康', 24, '男')
print('stu的toString：', stu)
print('stu的2dict方法：', student2dict(stu))
stu_json = json.dumps(stu, default=student2dict)
print('stu_json：', stu_json)
s = json.loads(stu_json)
print('s', s)
print("#############将对象转化为json字符串：使用lambda表达式#############")
stu_json_lambda = json.dumps(stu, default=lambda obj: obj.__dict__)
print(stu_json_lambda)
